home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MacHack 1997
/
MacHack 1997.toast
/
Hacks
/
Hacks ’95
/
Newt-A-Note & Suck-A-Note 1.0
/
Newt-A-Note
/
DropShell.c
< prev
next >
Wrap
Text File
|
1995-06-24
|
7KB
|
311 lines
/******************************************************************************
**
** Project Name: DropShell
** File Name: DropShell.c
**
** Description: Main application code for the QuickShell
**
*******************************************************************************
** A U T H O R I D E N T I T Y
*******************************************************************************
**
** Initials Name
** -------- -----------------------------------------------
** LDR Leonard Rosenthol
** MTC Marshall Clow
** SCS Stephan Somogyi
**
*******************************************************************************
** R E V I S I O N H I S T O R Y
*******************************************************************************
**
** Date Author Description
** --------- ------ ---------------------------------------------
** 23 Jun 94 LDR Implemented support for disk insertion events
** 02 Feb 94 LDR Updated for Final SDK & CodeWarrior a2
** Removed the ResumeProc as per new Apple recommendations
** 11 Dec 93 SCS Universal Headers/UPPs (Phoenix 68k/PPC & PPCC)
** Skipped System 6 compatible rev of DropShell source
** 09 Dec 91 LDR Added support for new "Select File…" menu item
** Quit now sends AEVT to self to be politically correct
** Added support for the new gSplashScreen
** 24 Nov 91 LDR Added support for the Apple Menu (duh!)
** 29 Oct 91 SCS Changes for THINK C 5
** 28 Oct 91 LDR Officially renamed DropShell (from QuickShell)
** Added a bunch of comments for clarification
** 06 Oct 91 MTC Converted to MPW C
** 09 Apr 91 LDR Added to Projector
**
******************************************************************************/
#ifndef __MWERKS__
#include <Desk.h>
#include <Dialogs.h>
#include <Errors.h>
#include <Files.h>
#include <Fonts.h>
#include <Memory.h>
#include <Menus.h>
#include <StandardFile.h>
#include <TextEdit.h>
#include <Types.h>
#include <Windows.h>
#endif
#include "DSGlobals.h"
#include "DSUserProcs.h"
#include "DSAppleEvents.h"
#include "DropShell.h"
#include "LlamaTalk.h"
#include "Comms.h"
Boolean gDone, gOApped, gHasAppleEvents, gWasEvent, gCanQuit;
EventRecord gEvent;
MenuHandle gAppleMenu, gFileMenu;
DialogPtr gSplashScreen;
#ifdef MPW
extern void _DataInit();
#endif
#pragma segment Initialize
void InitToolbox (void)
{
#ifdef MPW
UnloadSeg ((Ptr) _DataInit );
#endif
InitGraf ( &qd.thePort );
InitFonts ();
InitWindows ();
InitMenus ();
TEInit ();
InitDialogs (NULL); // use of ResumeProcs no longer approved by Apple
InitCursor ();
FlushEvents ( everyEvent, 0 );
// how about some memory fun! Two should be enough!
MoreMasters ();
MoreMasters ();
}
/*
Let's setup those global variables that the DropShell uses.
If you add any globals for your own use,
init them in the InitUserGlobals routine in DSUserProcs.c
*/
#pragma segment Initialize
Boolean InitGlobals (void)
{
long aLong;
gCanQuit = false;
gDone = false;
gOApped = false; // probably not since users are supposed to DROP things!
gHasAppleEvents = Gestalt ( gestaltAppleEventsAttr, &aLong ) == noErr;
gSplashScreen = NULL;
return(InitUserGlobals()); // call the user proc
}
/*
Again, nothing fancy. Just setting up the menus.
If you add any menus to your DropBox - insert them here!
*/
#pragma segment Initialize
void SetUpMenus (void) {
gAppleMenu = GetMenu ( kAppleNum );
AddResMenu ( gAppleMenu, 'DRVR' );
InsertMenu ( gAppleMenu, 0 );
gFileMenu = GetMenu ( kFileNum );
InsertMenu ( gFileMenu, 0 );
DrawMenuBar ();
}
/*
This routine is called during startup to display a splash screen.
This was recommend by the Blue Team HI person, John Sullivan, who
feels that all apps should display something so that users can easily
tell what is running, and be able to switch by clicking. Thanks John!
*/
#pragma segment Initialize
void InstallSplashScreen(void)
{
#define windowPicID 129
if (!gSplashScreen) { // show the splash screen window
gSplashScreen = GetNewDialog(windowPicID, nil, (WindowPtr)(-1));
DrawDialog(gSplashScreen);
}
}
/* --------------- Standard Event Handling routines ---------------------- */
#pragma segment Main
void ShowAbout () {
(void) Alert ( 128, NULL );
}
#pragma segment Main
void DoMenu ( long retVal ) {
short menuID, itemID;
Str255 itemStr;
menuID = HiWord ( retVal );
itemID = LoWord ( retVal );
switch ( menuID ) {
case kAppleNum:
if ( itemID == 1 )
ShowAbout (); /* Show the about box */
else
{
GetItem(GetMHandle(kAppleNum), itemID, itemStr);
OpenDeskAcc(itemStr);
}
break;
case kFileNum:
if ( itemID == 1 )
SelectFile(); // call file selection userProc
else {
gCanQuit = TRUE;
SendQuitToSelf(); // send self a 'quit' event
}
break;
default:
break;
}
HiliteMenu(0); // turn it off!
}
#pragma segment Main
void DoMouseDown ( EventRecord *curEvent ) {
WindowPtr whichWindow;
short whichPart;
whichPart = FindWindow ( curEvent->where, &whichWindow );
switch ( whichPart ) {
case inMenuBar:
DoMenu ( MenuSelect ( curEvent->where ));
break;
case inSysWindow:
SystemClick ( curEvent, whichWindow );
break;
case inDrag:
{
Rect boundsRect = (*GetGrayRgn())->rgnBBox;
DragWindow ( whichWindow, curEvent->where, &boundsRect );
}
default:
break;
}
}
#pragma segment Main
void DoKeyDown ( EventRecord *curEvent ) {
if ( curEvent->modifiers & cmdKey )
if ( (curEvent->message & 0xFF) == 0x2E)
gCanQuit = TRUE;
else
DoMenu ( MenuKey ((char) curEvent->message & charCodeMask ));
}
short isPressed(unsigned short k )
// k = any keyboard scan code, 0-127
{
unsigned char km[16];
GetKeys( (void *)km);
return ( ( km[k>>3] >> (k & 7) ) & 1);
}
#pragma segment Main
void main ( )
{
InitToolbox ();
if ( InitGlobals () ) { // if we succeeding in initting self
if ( !gHasAppleEvents )
ErrorAlert ( kErrStringID, kCantRunErr, 0 );
else {
InitAEVTStuff ();
SetUpMenus ();
InstallSplashScreen ();
MOpenComms();
while (! (gDone && gCanQuit) ) {
LTIdle(gLlamaTalkGlobals);
if (LTIsValidSocket(gLlamaTalkGlobals, gSocket)) {
gInDataHdl = LTRead(gLlamaTalkGlobals, gSocket);
if (gInDataHdl != nil) {
gCanQuit = TRUE;
DisposHandle(gInDataHdl);
}
}
else
if (LTGetSocketState(gLlamaTalkGlobals, gSocket) == cLTStateError) {
DebugStr("\pSocket is in error state, disposing of socket...");
LTDisposeSocket(gLlamaTalkGlobals, gSocket);
gSocket = 0;
}
gWasEvent = WaitNextEvent ( everyEvent, &gEvent, 0, NULL );
if ( gWasEvent ) {
switch ( gEvent.what ) {
case kHighLevelEvent:
DoHighLevelEvent ( &gEvent );
break;
case mouseDown:
DoMouseDown ( &gEvent );
break;
case keyDown:
case autoKey:
DoKeyDown ( &gEvent );
break;
case diskEvt:
if (HiWord(gEvent.message)) {
Point diskInitPt;
diskInitPt.v = diskInitPt.h = 100;
DILoad();
DIBadMount(diskInitPt, gEvent.message);
DIUnload();
}
break;
default:
break;
}
}
}
MCloseComms();
}
DisposeUserGlobals(); // call the userproc to clean itself up
}
}